<?php

require_once __DIR__ . '/AbstractController.php';
require_once __DIR__ . '/../../util/AlunoResultSet.php';
require_once __DIR__ . '/../../util/DataUtil.php';

/**
 * Abstração de controladores de busca de alunos.
 *
 * @author Hyzandey
 */
abstract class AlunoController extends AbstractController {

    const OPCAO = 'opcao';
    const BUSCA = 'busca';
    const COD_ESCOLA = 'codEscola';
    const COD_ESCOLA_LABEL =
            'Código da Escola (no caso de múltiplos, separados por vírgula)';
    const ERRO_ESCOLA_LIST =
            'Erro no processamento da lista de identificadores das escolas';
    const ANO_SEM = 'anosem';
    const ANO_SEM_LABEL = 'Ano/Semestre';
    const GET_VALOR = 'getValor';
    const GET_NOME = 'getNome';
    const GET_SIGLA = 'getSigla';
    const GET_NUMERO = 'getNumero';
    const CRE = 'cre';
    const CRE_PREFIXO = 'CRE - ';
    const CRE_LABEL = 'Coordenação Regional de Ensino';
    const NOME_ESCOLA = 'nomeEscola';
    const NOME_ESCOLA_LABEL = 'Nome da Escola';
    const TURNO = 'turno';
    const TURNO_LIST = 'turnoList';
    const TURNO_LABEL = 'Turno';
    const ANO_SEM_LIST = 'anosemList';
    const CRE_LIST = 'creList';
    const CONTROLLER_FILE = 'controllerFile';
    const CABECALHO_BUSCA = 'cabecalhoBusca.phtml';
    const RODAPE_BUSCA = 'rodapeBusca.phtml';
    const ALUNO_LISTA_VIEW_INFO = 'alunoList';
    const ENDERECO_PREFIXO = 'Endereço: ';
    const LOGRADOURO_PREFIXO = 'Logradouro: ';

    /**
     *
     * @var AlunoFiltro Filtro de pesquisa de alunos.
     */
    protected $filtro;
    protected $anoSemestreDAO;
    protected $turnoDAO;
    protected $creDAO;
    protected $isEJA;
    protected $alunoDAO;

    protected abstract function constroiFiltro();

    protected abstract function isEJA();

    protected abstract function getNomeViewBusca();

    /**
     * Constroi o gerador de CSV específico das subclasses.
     *
     * @param AlunoResultSet $alunoResultSet ResultSet de
     * alunos para geração do CSV.
     * 
     * @return AlunoGeradorCSV gerador de CSV para o tipo específico de aluno;
     */
    protected abstract function getGeradorCSV($alunoResultSet);

    protected function renderizaCSV() {

        $alunoResultSet = new AlunoResultSet($this->alunoDAO);

        $gerador = $this->getGeradorCSV($alunoResultSet);
        
        ob_clean();
        ob_start();
        
        $this->insereCabecalhoCSV();     
        
        $gerador->echoCSV();
        
        ob_end_flush();
    }

    protected function renderizaBusca() {
        $this->preencheListaCombos();

        $this->loadView($this->getNomeViewBusca());
    }

    protected function loadView($view) {
        $this->insertViewInfo(array(
            //Nome do controlador para a action da view.
            self::CONTROLLER_FILE => get_class($this) . '.php'
        ));
        parent::loadView($view);
    }

    public function __construct() {

        $this->isEJA = $this->isEJA();

        $this->constroiFiltro();

        $this->preencheFiltro();

        $this->constroiDAOs();
    }

    public function executa() {

        $option = $this->getPost(self::OPCAO);

        if ($option && $option == self::BUSCA) {
            $this->renderizaCSV();
        } else {
            $this->renderizaBusca();
        }
    }

    protected function preencheListaCombos() {

        $this->insertViewInfo(array(
            self::ANO_SEM_LIST => $this->anoSemestreDAO->find(),
            self::TURNO_LIST => $this->turnoDAO->find(),
            self::CRE_LIST => $this->creDAO->find()
        ));
    }

    protected function constroiDAOs() {
        $this->anoSemestreDAO = new AnoSemestreDAO($this->isEJA);
        $this->creDAO = new CREDAO($this->isEJA);
        $this->turnoDAO = new TurnoDAO($this->isEJA);
    }

    protected function processEscolaIdList() {

        $escolaIdList = array();

        $escolaIdString = $this->getPost(self::COD_ESCOLA);

        //Há filtro de lista de identificadores escolas
        if ($escolaIdString) {

            $splitArray = explode(',', $escolaIdString);

            //Erro da função split
            if ($splitArray === false || gettype($splitArray) != 'array') {
                throw new ErrorException(self::ERRO_ESCOLA_LIST);
            }

            for ($i = 0; $i < sizeof($splitArray); $i++) {
                $splitArray[$i] = trim($splitArray[$i]);
            }

            $escolaIdList = $splitArray;
        }

        return $escolaIdList;
    }

    protected function preencheFiltro() {
        $this->filtro->setAnoSem($this->getPost(self::ANO_SEM));
        $this->filtro->setCre($this->getPost(self::CRE));
        $this->filtro->setNomeEscola($this->getPost(self::NOME_ESCOLA));
        $this->filtro->setTurno($this->getPost(self::TURNO));
        $this->filtro->setEscolaIdList($this->processEscolaIdList());
    }

}

?>
